package com.girl.controller;


import com.girl.entity.Girl;
import com.girl.entity.Result;
import com.girl.repository.GirlRepository;
import com.girl.service.GirlService;
import com.girl.utils.ResultUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.*;

import javax.validation.Valid;
import java.util.List;

@RestController
public class GirlController {

//    使用@Autowired注解自动注入repository
    @Autowired
    private GirlRepository repository;

    @Autowired
    private GirlService service;
    @GetMapping(value = "/girls")
    public List<Girl> getGirlList(){
        return repository.findAll();
    }


    /**
     * 这种方法并不推荐使用，因为当属性越多的时候就会显得比较繁琐，
     * @return
     */
//    @PostMapping("/girls")
//    public Girl addGirl(int age,String cipSize){
//        Girl girl = new Girl();
//        girl.setAge(age);
//        girl.setCupSize(cipSize);
//        return repository.save(girl);
//    }

    /**
     * 获取参数比较推荐使用下面这种方式，可以直接从属性转变成一个实体类，前提是这个实体类有默认的构造方法，有对应属性的set方法
     * 使用@Vaild 注解表示一个验证，验证的是girl这个对象
     * @param girl
     * @return
     */
    @PostMapping("/girls")
    public Result<Girl> addGirl(@Valid Girl girl, BindingResult bindingResult){
        /**
         * 使用统一的返回结果处理，对异常进行封装，然后将异常返回给前端，
         */
        if(bindingResult.hasErrors()){
            return ResultUtil.error(1,bindingResult.getFieldError().getDefaultMessage());
        }
        return ResultUtil.success(repository.save(girl));
    }


    @GetMapping(value = "/girls/{id}")
    public Girl findGilr(@PathVariable int id){
        return repository.getOne(id);
    }

    @PutMapping(value = "/girls/{id}")
    public Girl updateGirl(@PathVariable("id") int id,
                           @RequestParam("age")int age,
                           @RequestParam("cupSize")String cupSize){
        Girl girl = new Girl();
        girl.setId(id);
        girl.setAge(age);
        girl.setCupSize(cupSize);
        return repository.save(girl);
    }

    @DeleteMapping("/girls/{id}")
    public void deleteGirl(@PathVariable("id")int id){
        repository.delete(id);
    }

    @GetMapping("/girls/find")
    public List<Girl> findGirlByAge(@RequestParam Integer age){
        return repository.findGirlByAge(age);
    }

    @GetMapping("/girl/two")
    public void insertTwo(){
        service.insertTwo();
    }

    @GetMapping("/girls/getAge/{id}")
    public void getAge(@PathVariable("id")Integer id){
        service.getAge(id);
    }
}
